package com.xxy.linklist;

import com.xxy.test.ListNode;

import java.util.ArrayList;
import java.util.List;

/**
 * 单链表
 * 数据结构：有data域，存放数据
 * next 指向下一个元素的
 * 添加元素：
 * 先创建一个头结点，作用就表示单链表的头
 * 后面我们没添加一个元素，加入到链表的最后
 *
 * @author xxy
 * @create 2020 10 21 9:46
 */
public class SingleLinkLIst {
    public static void main(String[] args) {
        HeroNode heroNode=new HeroNode(1,"小可爱呀","yaya");
        HeroNode heroNode1 = new HeroNode(2,"xxy","是我呀");
        HeroNode heroNode2 = new HeroNode(3,"aaa", "是她呀");
        SingleList singleList = new SingleList();
        singleList.add(heroNode);
        singleList.list();
        HeroNode heroNode3 = new HeroNode(1,"xxy","xxy");
        singleList.update(heroNode3);
        singleList.list();

    }
}
//创建链表
class SingleList{
    //先创建一个头结点,不存放数据
    private HeroNode head = new HeroNode(0,"","");
    //添加结点的链表
    /**
     * 当不考虑编号的顺序时
     * 1.找到当前链表的最后一个节点
     * 2.将最后一个节点的next指向新的节点
     */
    public void add(HeroNode heroNode){
        HeroNode temp = head;//头结点的辅助结点
        //遍历链表
        while(true){
            if(temp.next==null){
                break;//如果为空，就找到了最后一个节点
            }
            //不为空，就往后移
            temp=temp.next;
        }
        //退出循环，说明到了最后的一个节点，将最后一个节点，指向当前的节点
        temp.next=heroNode;
    }
    //显示链表
    public void list(){
        //先判断是否为空
        if(head.next==null){
            System.out.println("链表为空！");
            return;
        } HeroNode temp = head.next;//头结点的辅助结点
        while(true){
            if(temp==null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;

        }
    }
    //修改节点信息
    public void update(HeroNode newHeroNode){
        if(head.next==null){
            System.out.println("链表为空！！");
            return;
        }
        HeroNode temp = head.next;//辅助节点
        boolean flag = false;//判断是否找到该节点
        while(true){
            if(temp==null){
                break;//表已经遍历完
            }
            if(temp.no==newHeroNode.no){
                flag=true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            temp.name=newHeroNode.name;
            temp.nickname= newHeroNode.nickname;
        }else {
            System.out.println("不存在这个节点！！");
        }


    }
    //标号排序，不根据插入的顺序，其实就是链表的插入
    public void addByOrder(HeroNode heroNode){
        //还是头结点不能动，需要一个辅助的头结点
        //由于是单链表，只能通过添加位置的前一个节点加进去，否则加不进去
        HeroNode temp = head;
        boolean flag =false;//代表链表中，是否存在这个节点，如果存在，就不用添加
        while(true){
            if(temp.next==null){
                break;//说明链表已经到了最后
            }
            if(temp.next.no>heroNode.next.no){
                break;//位置找到，就放在temp的后面
            }else  if (temp.next.no==heroNode.next.no){
                flag = true;//链表中已经存在这个节点
                break;
            }
            temp = temp.next;
        }
        if(flag){
            System.out.println("链表中已经存在这个节点"+heroNode.no);
        }else {
            heroNode.next = temp.next;
            temp.next=heroNode;
        }
    }
    public void del(int no){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            if(temp.next==null){
                break;//已经遍历到了最后
            }
            if(temp.next.no==no){
                flag  = true;//已经找到
                break;
            }
            temp = temp.next;
        }
        if(flag){
            temp.next.next = temp.next;
        }else {
            System.out.println("不存在这个节点！");
        }
    }
}
//定义HeroNode，每个HeroNode对象就是一个节点
class HeroNode{
        public int no;//英雄的编号
        public String name;//英雄的名字
        public String nickname;//英雄的昵称
        public HeroNode next;//下一个节点
        //构造器
    public HeroNode(int no, String name, String nickname) {
            this.no = no;
            this.name = name;
            this.nickname = nickname;
        }
        @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
